package handler;

import utils.ServiceTool;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @author HLF
 * @version V1.0
 * @package handler
 * @date 2021/10/15 8:42
 */
public class MyInvocationHandler implements InvocationHandler {
    private Object target;//SomeServiceImpl类对象

    public MyInvocationHandler() {
    }

    //动态代理：目标对象是活动的，不是固定的，需要传入进来。
    //传入是谁，就给谁创建代理。
    //也可以使用注解的方式给目标对象赋值
    public MyInvocationHandler(Object target) {
        //给目标对象赋值
        this.target = target;
    }

    /**
     * 通过代理对象执行方法时，会执行这个invoke();
     * @param proxy
     * @param method 目标类的方法
     * @param args 目标类方法的参数
     * @return 执行目标方法的返回值
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行了MyInvocationHandler的invoke方法");

        Object res = null;//执行目标类方法的返回值

        /**
         * 设置只有执行doSome方法时才设置日志 事务功能
         */
        if ("doSome".equals(method.getName())){//JoinPoint连接点 Pointcut切入点(连接点的集合)
            //执行增强功能，增加日志功能
            ServiceTool.doLog();

            //使用Advice通知定义切入的时间,执行目标方法之前

            //执行目标类的方法，通过Method类实现
            res = method.invoke(target, args);//SomeServiceImpl对象.doSome()  SomeServiceImpl对象.doOther()
            System.out.println("当前执行的方法名称是：" + method.getName());

            //使用Advice通知定义切入的时间,执行目标方法之后

            //执行增强功能，增加事务功能
            ServiceTool.doTransaction();
        } else {
            //执行目标类的方法，通过Method类实现
            res = method.invoke(target, args);//SomeServiceImpl对象.doSome()  SomeServiceImpl对象.doOther()
            System.out.println("当前执行的方法名称是：" + method.getName());
        }

        //返回目标方法的执行结果
        return res;
    }
}
